Copyright(C) 1994 Terumasa KODAKA , Takeshi KONO


■カレンダ/インターバルタイマ BIOS


INT 1Ch - Function 00h
分類	TIMER BIOS
名前	日付・時刻の読み出し
対象	ノーマル,ハイレゾ,PC-98LT・HA
入力	AH=00h
	ES:BX=データバッファの先頭アドレス
出力	AX=不定
	<バッファの形式>
	------------------+-----------------------------------
	アドレス          |内容
	------------------+-----------------------------------
	ES:BX+00h         |年(BCD:00〜99h)
	ES:BX+01h bit 7〜4|月(1h=1月, …, Ch=12月)
	          bit 3〜0|曜日(0h=日曜, …, 6h=土曜)
	ES:BX+02h         |日(BCD:01〜31h)
	ES:BX+03h         |時(BCD:00〜23h)
	ES:BX+04h         |分(BCD:00〜59h)
	ES:BX+05h         |秒(BCD:00〜59h)
	------------------+-----------------------------------
	* BCDは、bit 7〜4が10の位、bit 3〜0が1の位
解説  o 日付と時刻をカレンダ時計LSIから取得して、指定されたバッファに書き込む。
      u	カレンダ時計LSIから時刻情報を取り出す場合、1ビットづつシリアルに
	読み出す必要があるため、このファンクションの実行には0.5m〜1.0m秒
	程度(条件によって異なる)の時間がかかる。
      o PC-9801初代・E・F・M・U・VM2・VF・UV2, PC-98XA, PC-98LTでは、年の情報が
	メモリスイッチ8に格納されているため、年は自動的に更新されない。閏年も
	考慮されない。
	これ以外の機種では、年の更新や閏年の2月29日の設定は自動的に行われる。
      u PC-9801P・BA2・BS2・BX2, PC-9821Ne・Ap2・As2・Bp・Bs・Be・Tsの一部のロット
	では、電源OFFの状態で日付が変わったとき、年の更新や閏年の2月29日の
	設定が自動的に行われない。NECから、この症状を回避するためのパッチが
	公開されている。このパッチをIO.SYSにあてるとINT 1Chをフックするように
	なるが、このとき、最長でパッチ前に比べて3倍程度の時間がかかることが
	ある。
      u テクニカルデータブックにはAXが不定になるという記述があるが、
	実際には変化しない。
関連	INT 1Ch - Function 01h
	I/O 0020h
	A000:3FFEh[PC-9801初代・E・F・M・U・VM2・VF・UV2]
	E000:3FFEh[PC-98XA]
	D000:3808h[PC-98LT]


INT 1Ch - Function 01h
分類	TIMER BIOS
名前	日付・時刻の設定
対象	ノーマル,ハイレゾ,PC-98LT・HA
入力	AH=01h
	ES:BX=データバッファの先頭アドレス
	<バッファの形式>
	------------------+-----------------------------------
	アドレス          |内容
	------------------+-----------------------------------
	ES:BX+00h         |年(BCD:00〜99h)
	ES:BX+01h bit 7〜4|月(1h=1月, …, Ch=12月)
	          bit 3〜0|曜日(0h=日曜, …, 6h=土曜)
	ES:BX+02h         |日(BCD:01〜31h)
	ES:BX+03h         |時(BCD:00〜23h)
	ES:BX+04h         |分(BCD:00〜59h)
	ES:BX+05h         |秒(BCD:00〜59h)
	------------------+-----------------------------------
	* BCDは、bit 7〜4が10の位、bit 3〜0が1の位
出力	AX=不定
解説  o 日付と時刻をカレンダ時計LSIに設定する。
      u	カレンダ時計LSIに時刻情報を設定する場合、1ビットづつシリアルに書き込む
	必要があるため、このファンクションの実行には0.5m〜1.0m秒程度(機種、
	条件によって異なる)の時間がかかる。
      u テクニカルデータブックにはAXが不定になるという記述があるが、
	実際には変化しない。
関連	INT 1Ch - Function 00h
	I/O 0020h
	A000:3FFEh[PC-9801初代・E・F・M・U・VM2・VF・UV2]
	E000:3FFEh[PC-98XA]
	D000:3808h[PC-98LT]


INT 1Ch - Function 02h
分類	TIMER BIOS
名前	インターバルタイマの設定(シングルイベント)
対象	ノーマル,ハイレゾ,PC-98LT・HA
入力	AH=02h
	CX=インターバルタイマ値(単位:10ms)
	* 0を指定すると10000hとして動作
	ES:BX=タイムアウト時のユーザルーチンエントリ
出力	AX=不定
解説  o このファンクションを実行してからCXで指定された時間が経過すると、
	ES:BXで指定されたユーザルーチンが1回呼び出される。
	このファンクションはシングルイベント用なので、一度このファンクションで
	設定を行うと、タイムアウトするまで再度このファンクションを実行する
	ことはできない。タイムアウトする前に、再度このファンクションを実行する
	と、その前の設定は無効になり、新しい設定だけが有効になる。
      o ハイレゾモードでは、このファンクションで行った設定がタイムアウトする
	前でも、INT 1Ch - Function 04h,05hのマルチイベント対応ファンクションは
	実行できる。このとき、このファンクションで行った設定が無効になることは
	ない。
      u	ノーマルモード(PC-98DO+を除く)とPC-98LT・HAでは、このファンクションを
	実行すると以下のような処理を行う。
	- ES:BXで指定したユーザルーチンのエントリアドレスをINT 07hベクタに
	  セットする。
	- CXで指定したインターバルタイマ値を0000:058Ahにセットする。
	- タイマ(8253A)のチャネル0に、10ms周期のパルスが発生するよう設定。
	- 割り込みコントローラ(8259A)のマスタに、INT 08h(外部割り込み)の
	  割り込み許可の設定。
	以後、10ms毎にINT 08h(外部割り込み)が発生し、BIOS内のタイマ割り込み
	ハンドラがインターバルタイマ値(0000:058Ah)をデクリメント
	する。インターバルタイマ値が0になってタイムアウトすると、INT 07hを
	実行してユーザルーチンを呼び出す。
      u	ハイレゾモードとPC-98DO+では、このファンクションを実行すると以下の
	ような処理を行う。
	- ES:BXで指定したユーザルーチンのエントリアドレスを0000:044Chに
	  セットする。
	- CXで指定したインターバルタイマ値を0000:058Ahにセットする。
	- タイマ割り込みが使用中でなければ、タイマ(8253A)のチャネル0に、
	  10ms周期のパルスが発生するよう設定。また、割り込みコントローラ
	  (8259A)のマスタに、INT 08h(外部割り込み)の割り込み許可の設定。
	以後、10ms毎にINT 08h(外部割り込み)が発生し、BIOS内のタイマ割り込み
	ハンドラがインターバルタイマ値(0000:058Ah)をデクリメント
	する。インターバルタイマ値が0になってタイムアウトすると、PUSHFした
	あと、0000:044ChにセットされているアドレスをFARコールしてユーザ
	ルーチンを呼び出す。
      o ユーザルーチンを作成する際は、以下のようにする。
	- ユーザルーチンのなかでは、フラグ以外の全レジスタを保証しなければ
	  ならない。
	- 割り込みコントローラへのEOI(End Of Interrupt)の発行は、ユーザルーチン
	  移行前にBIOSが行っている。ユーザルーチン内でEOIを発行してはならない。
	- ユーザルーチンの処理が終了したら、IRETで戻る。
      u ユーザルーチンが呼び出されたとき、CPUのIF(Interrupt Flag)の状態は
	機種により次のように異なる。ノーマルモード(PC-98DO+を除く)と
	PC-98LT・HAでは0(割り込み禁止状態)。ハイレゾモードとPC-98DO+では1
	(割り込み許可状態)。
      u PC-98DO+では、ユーザルーチンのアドレスはINT 07hベクタではなく、
	ハイレゾと同じアドレス(0000:044Ch)を使用する。
      u PC-9801初代の一部のロットに、タイマ用ダウンカウンタ0000:058Ahに
	アクセスすべき部分で、0050:058Ahをアクセスしているものがあり、
	そのような場合には正しく動作しない。
      u テクニカルデータブックにはAXが不定になるという記述があるが、
	実際には変化しない。
関連	INT 07h(タイマBIOS)
	INT 08h(外部割込)
	0000:044Ch[ハイレゾ,PC-98DO+]
	0000:0459h bit 5[ハイレゾ]
	0000:058Ah
	I/O 0000h
	I/O 0071h


INT 1Ch - Function 03h(ハイレゾ)
分類	TIMER BIOS
名前	タイマキャンセル
対象	ハイレゾ
入力	AH=03h
	ES:BX=キャンセルするパラメータブロックのアドレス
出力	AH=終了条件(実際には終了条件が返らない。「機能」欄参照)
	  00h: 正常終了
	  FFh: ES:BXで指定されたメモリはパラメータブロックとして登録
	       されていない
解説  o INT 1Ch - Function 04h,05hで起動されたインターバルタイマの設定を
	キャンセルする。
      u テクニカルデータブックには、AHに終了条件が返るという記述があるが、
	実際には呼び出し前の状態から変化しない。
関連	INT 1Ch - Function 04h
	INT 1Ch - Function 05h


INT 1Ch - Function 03h
分類	TIMER BIOS
名前	タイマBIOS内部使用
対象	ノーマル,PC-98LT・HA
入力	AH=03h
出力	なし
解説  o INT 08h割り込みハンドラから呼ばれる。
	8253Aのチャネル0にインターバルタイマのカウント値(10ms周期)を
	ロードして、割り込みコントローラのタイマ割り込みを解除する。
関連	INT 1Ch - Function 02h


INT 1Ch - Function 04h
分類	TIMER BIOS
名前	インターバルタイマの設定(マルチイベント対応,ワンショットモード)
対象	ハイレゾ
入力	AH=04h
	ES:BX=パラメータブロック(12バイト)のアドレス
	<パラメータブロックの形式>
	------------------+--------------------------------------
	アドレス          |内容
	------------------+--------------------------------------
	ES:BX+00h(DWORD)  |BIOSワークエリア(次のパラメータブロックへのポインタ)
	ES:BX+04h(WORD)   |BIOSワークエリア(リピーテッドモード用)
	ES:BX+06h(WORD)   |インターバルタイマ値(単位:10ms)
	ES:BX+08h(DWORD)  |タイムアウト時のユーザルーチンエントリ
	------------------+--------------------------------------
	* BIOSワークエリアはユーザが設定する必要はない
出力	AX=不定
解説  o このファンクションを実行してからES:BX+06hで指定された時間が経過すると、
	ES:BX+08hで指定されたユーザルーチンが1回呼び出される。
	このファンクションはマルチイベント対応なので、最初に設定した設定内容
	(イベント)がタイムアウトする前に、別のイベントを追加登録することが
	できる。
      u	このファンクションを実行すると以下のような処理を行う。
	- タイマ割り込みが使用中でなければ、ES:BXを0000:0444hにセットし、
	  タイマ(8253A)のチャネル0に10ms周期のパルスが発生するよう
	  設定。また、割り込みコントローラ(8259A)のマスタに、
	  INT 08h(外部割り込み)の割り込み許可の設定。
	- タイマ割り込みが使用中だったときは、0000:0444hからのリンクをたどり、
	  今回指定したパラメータブロックをリンクに追加。
	10ms毎に発生するINT 08h(外部割り込み)の割り込みハンドラは、
	0000:0444hからのリンクをたどり、登録されている全てのイベントの
	インターバルタイマ値をデクリメントする。
	インターバルタイマ値が0になってタイムアウトになったイベントがあると、
	タイムアウト時のユーザルーチンエントリをパラメータブロックからINT 07h
	ベクタにコピーし、INT 07hを実行してユーザルーチンを呼び出す。
	タイムアウトになったイベントのパラメータブロックは、リンクから削除
	される。
      o ユーザルーチンを作成する際は、以下のようにする。
	- ユーザルーチンのなかでは、フラグ以外の全レジスタを保証しなければ
	  ならない。
	- ユーザルーチンに実行が移った状態では、CPUのIF(Interrupt Flag)は0
	  (割り込み禁止状態)。
	- 割り込みコントローラへのEOI(End Of Interrupt)の発行は、ユーザルーチン
	  移行前にBIOSが行っている。ユーザルーチン内でEOIを発行してはならない。
	- ユーザルーチンの処理が終了したら、IRETで戻る。
      u テクニカルデータブックには、ユーザルーチンからIRETする際、AHに00hを
	セットすると記述されているが、その必要はない。
      u テクニカルデータブックにはAXが不定になるという記述があるが、
	実際には変化しない。
関連	INT 1Ch - Function 02h
	INT 1Ch - Function 03h
	0000:0444h
	0000:0459h bit 5


INT 1Ch - Function 05h
分類	TIMER BIOS
名前	インターバルタイマの設定(マルチイベント対応,リピーテッドモード)
対象	ハイレゾ
入力	AH=05h
	ES:BX=パラメータブロックのアドレス
	<パラメータブロックの形式>
	------------------+--------------------------------------
	アドレス          |内容
	------------------+--------------------------------------
	ES:BX+00h(DWORD)  |BIOSワークエリア(次のパラメータブロックへのポインタ)
	ES:BX+04h(WORD)   |BIOSワークエリア(タイムアウト値の初期値)
	ES:BX+06h(WORD)   |タイムアウト値(単位:10ms)
	ES:BX+08h(DWORD)  |タイムアウト時のユーザルーチンエントリ
	------------------+--------------------------------------
	* BIOSワークエリアはユーザが設定する必要はない
出力	AX=不定
解説  o このファンクションを実行すると、ES:BX+06hで指定された時間間隔で、
	ES:BX+08hで指定されたユーザルーチンが呼び出される。
	このファンクションはマルチイベント対応なので、最初に設定した設定内容
	(イベント)がタイムアウトする前に、別のイベントを追加登録することが
	できる。
      u	このファンクションを実行すると以下のような処理を行う。
	- タイマ割り込みが使用中でなければ、ES:BXを0000:0444hにセットし、
	  タイマ(8253A)のチャネル0に10ms周期のパルスが発生するよう
	  設定。また、割り込みコントローラ(8259A)のマスタに、
	  INT 08h(外部割り込み)の割り込み許可の設定。
	- タイマ割り込みが使用中だったときは、0000:0444hからのリンクをたどり、
	  今回指定したパラメータブロックをリンクに追加。
	10ms毎に発生するINT 08h(外部割り込み)の割り込みハンドラは、
	0000:0444hからのリンクをたどり、登録されている全てのイベントの
	インターバルタイマ値をデクリメントする。
	インターバルタイマ値が0になってタイムアウトになったイベントがあると、
	タイムアウト時のユーザルーチンエントリをパラメータブロックからINT 07h
	ベクタにコピーし、INT 07hを実行してユーザルーチンを呼び出す。
	AH=00h以外でユーザルーチンから戻ったとき、このイベントは再設定される。
	AH=00hでユーザルーチンから戻ったときは、このイベントのパラメータ
	ブロックは、リンクから削除される。
      o ユーザルーチンを作成する際は、以下のようにする。
	- ユーザルーチンのなかでは、フラグ以外の全レジスタを保証しなければ
	  ならない。
	- ユーザルーチンに実行が移った状態では、CPUのIF(Interrupt Flag)は0
	  (割り込み禁止状態)。
	- 割り込みコントローラへのEOI(End Of Interrupt)の発行は、ユーザルーチン
	  移行前にBIOSが行っている。ユーザルーチン内でEOIを発行してはならない。
	- ユーザルーチンの処理が終了したら、IRETで戻る。
	- IRETで戻るとき、AHにリピート条件を設定する。
	    00h:リピート中止
	    FFh:リピート続行
      u テクニカルデータブックにはAXが不定になるという記述があるが、
	実際には変化しない。
関連	INT 1Ch - Function 02h
	INT 1Ch - Function 03h
	0000:0444h
	0000:0459h bit 5


INT 1Ch - Function 06h
分類	TIMER BIOS
名前	ビープ機能
対象	ハイレゾ
入力	AH=06h
	CX=鳴動時間(単位10msec)
	* 0のときは鳴らない
	DX=8253Aの分周値
出力	なし
解説  o 指定された時間と周波数でビープ音を鳴らす。ビープ停止はタイマ割り込みで
	行うため、このファンクションの処理はビープ停止を待たずに終了する。
      u このファンクションを実行しても、INT 18h - Function 23hで設定した
	デフォルトのブザー周波数には影響を与えない。
      o INT 18h - Function 24hでは、DXに周波数を設定するのに対し、
	このファンクションでは8253Aの分周値を設定する。
関連	INT 18h - Function 24h
	0000:0448h
	0000:044Ah


INT 1Ch - Function 07h
分類	TIMER BIOS
名前	アラーム機能の設定
対象	PC-98HA
入力	AH=07h
	ES:BX=データバッファ(6バイト)
	<データバッファの形式>
	------------------+-----------------------------------
	アドレス          |内容
	------------------+-----------------------------------
	ES:BX+00h         |月(BCD:01〜12h)
	ES:BX+01h         |日(BCD:01〜31h)
	ES:BX+02h         |曜日(常にFFhを設定)
	ES:BX+03h         |時(BCD:00〜23h)
	ES:BX+04h         |分(BCD:00〜59h)
	ES:BX+05h         |秒(BCD:00〜59h)
	------------------+-----------------------------------
	* 0Fhを設定すると、その桁は常に設定時刻と一致しているものと
	  みなされる。0Fhは4ビットごとに設定可能。
出力	CF=終了条件(実際には終了条件が返らない。「機能」欄参照)
	    1=異常終了
	    0=正常終了
解説  o 指定した時刻になると、電源OFFなら自動的に電源がONになり、
	アラーム鳴動用ファンクション(INT 1Fh - Function 8Eh,8Fh)を
	実行する。
      o アプリケーションまたはドライバがアラーム(ブザー)を鳴動させる場合
	には、INT 1Fh - Function 8Eh,8Fhをトラップして、ブザー鳴動の処理を
	独自に行う必要がある。
      u テクニカルデータブックには、CFに終了条件が返るという記述があるが、
	実際には常に0になる。
関連	INT 1Ch - Function 08h
	INT 1Ch - Function 09h
	INT 1Fh - Function 8Eh
	INT 1Fh - Function 8Fh
	I/O 0022h


INT 1Ch - Function 08h
分類	TIMER BIOS
名前	アラーム設定の解除
対象	PC-98HA
入力	AH=08h
出力	CF=終了条件(実際には終了条件が返らない。「機能」欄参照)
	    1=異常終了
	    0=正常終了
解説  o INT 1Ch - Function 07hで設定したアラームの設定を解除する。
      u テクニカルデータブックには、CFに終了条件が返るという記述があるが、
	実際には常に0になる。
関連	INT 1Ch - Function 07h


INT 1Ch - Function 09h
分類	TIMER BIOS
名前	アラーム設定状態の読み出し
対象	PC-98HA
入力	AH=09h
	ES:BX=データバッファの先頭アドレス
出力	CF=終了ステータス
	    1=設定あり
	    0=設定なし
解説  o INT 1Ch - Function 07hで設定したアラームの設定内容を読み出す。
	設定があった場合、ES:BXで指定されたバッファに日付・時刻データを
	書き込む。バッファのフォーマットはファンクション07hと同じ。
関連	INT 1Ch - Function 07h